package com.kexio.sms.service;

import java.util.Map;

import com.kexio.common.dto.Result;
import com.kexio.sms.entity.SmsRecord;

/**
 * 短信服务接口
 * 
 * @author Kexio Team
 * @since 1.0.0
 */
public interface SmsService {
    
    /**
     * 发送短信 (使用默认模板)
     * 
     * @param phone 手机号码
     * @param content 短信内容
     * @param smsType 短信类型
     * @return 发送结果
     */
    Result<SmsRecord> sendSms(String phone, String content, String smsType);
    
    /**
     * 发送短信 (使用指定模板)
     * 
     * @param phone 手机号码
     * @param templateCode 模板编码
     * @param templateParams 模板参数
     * @param smsType 短信类型
     * @return 发送结果
     */
    Result<SmsRecord> sendSms(String phone, String templateCode, Map<String, Object> templateParams, String smsType);
    
    /**
     * 批量发送短信
     * 
     * @param phones 手机号码列表
     * @param content 短信内容
     * @param smsType 短信类型
     * @return 发送结果
     */
    Result<String> batchSendSms(String[] phones, String content, String smsType);
    
    /**
     * 批量发送短信 (使用模板)
     * 
     * @param phones 手机号码列表
     * @param templateCode 模板编码
     * @param templateParams 模板参数
     * @param smsType 短信类型
     * @return 发送结果
     */
    Result<String> batchSendSms(String[] phones, String templateCode, Map<String, Object> templateParams, String smsType);
    
    /**
     * 查询发送记录
     * 
     * @param recordId 记录ID
     * @return 发送记录
     */
    SmsRecord getRecord(String recordId);
    
    /**
     * 查询发送状态
     * 
     * @param recordId 记录ID
     * @return 发送状态
     */
    String getStatus(String recordId);
    
    /**
     * 检查服务提供商是否支持
     * 
     * @param provider 服务提供商
     * @return 是否支持
     */
    boolean isProviderSupported(String provider);
    
    /**
     * 获取当前使用的服务提供商
     * 
     * @return 服务提供商
     */
    String getCurrentProvider();
    
    /**
     * 切换服务提供商 (主备切换)
     * 
     * @param provider 服务提供商
     * @return 切换结果
     */
    Result<String> switchProvider(String provider);
    
    /**
     * 获取发送统计信息
     * 
     * @param timeRange 时间范围 (today, week, month)
     * @return 统计信息
     */
    Map<String, Object> getStatistics(String timeRange);
}
